/*
 * jBox 1.0 - a webpage UI dialog widget written in javascript on top of the jQuery library
 * By Daniel Lin(http://www.aspstat.com)
 * Copyright (c) 2007 Daniel Lin
 * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
 */
jQuery.fn.openjBox = function(boxAttr, title) {
	var $this = jQuery(this);
	$this.attr('jBoxID', jBox.open('jBox' + $this.attr('id'), 'div', $this
			.attr('id'), title, boxAttr).jBoxID);
}
jQuery.fn.disposejBox = function(boxAttr, title) {
	var $this = jQuery(this);
	if ($this.get(0).getAttribute('jBoxID') != null) {
		jBox.boxes[parseInt($this.get(0).getAttribute('jBoxID'))].dispose();
		$this.removeAttr('jBoxID');
	} else {
		alert('pls use openjBox first to Instance a jBox instance!');
	}
}
jQuery.fn.showjBox = function(boxAttr, title) {
	var $this = jQuery(this);
	if ($this.get(0).getAttribute('jBoxID') != null) {
		jBox.boxes[parseInt($this.get(0).getAttribute('jBoxID'))].show();
	} else {
		alert('pls use openjBox first to Instance a jBox instance!');
	}
}
jQuery.fn.hidejBox = function(boxAttr, title) {
	var $this = jQuery(this);
	if ($this.get(0).getAttribute('jBoxID') != null) {
		jBox.boxes[parseInt($this.get(0).getAttribute('jBoxID'))].hide();
	} else {
		alert('pls use openjBox first to Instance a jBox instance!');
	}
}
function getPath(){
	var jsPath;
	var js= document.getElementsByTagName("script");
	for(var i=js.length;i>0;i--){
	if(js[i-1].src.indexOf("jbox.js")>-1){
		    jsPath=js[i-1].src.substring(0,js[i-1].src.lastIndexOf("/")+1);     
		
		}
	}
 return jsPath;
}
var jBox = {
	
	imgs : [ getPath() + '/css/img/min.gif',
			 getPath() + '/css/img/close.gif',
			 getPath() + '/css/img/restore.gif',
			 getPath() +  '/css/img/resize.gif' ],
	boxes : [],
	minimizeorder : 0,
	init : function(id,buttonsEvent) {
		var holder = $('#jBoxHolder');
		if (holder.length == 0) {
			holder = $('<div id="jBoxHolder"></div>');
			$(document.body).append(holder);
		}

		var box = $('<div class="jBox" id="jb' + id + '"></div').appendTo(
				holder);
		box
				.append('<div class="jBoxHandler">jBox<div class="jBoxControls"><img src="'
						+ this.imgs[0]
						+ '" title="Minimize" /><img src="'
						+ this.imgs[1] + '" title="关闭"/></div></div>')
		box.append('<div class="jBoxContent"></div>');
		/*处理按钮的功能*/
		var count = 0;
		var divButton = $('<div class="jBoxButton"></div>');
		for ( var label in buttonsEvent) {
			
			divButton.append('<button id="button' + count + '" title="' + label
					+ '" >' + label + '</button>');
			divButton.find('button#button' + count).click(buttonsEvent[label]);
			// box.append(buttons);
			count++;
		}
		divButton.append('<button id="buttonClose" title="关闭">关闭</button>');
		
		
		divButton.find('button#buttonClose').click(function() {
			$('#jb' + id).disposejBox(null,null);
		});
		
		divButton.find('button').mouseover(function(){$(this).addClass("mhover");});
		divButton.find('button').mouseout(function(){$(this).removeClass("mhover");});
		
		
		box.append(divButton);
		
		// box.append('<div class="jBoxButton"><button title="关闭"
		// id="jBoxCloseButton">关闭</button>');
		// box.append('<div class="jBoxStatus"><div class="jBoxResize"
		// style="background: url('+this.imgs[3]+')
		// no-repeat;">&nbsp;</div></div');

		box.css('zIndex', $('div.jBox').length + 99);
		box.handler = box.find('div.jBoxHandler');
		box.controls = box.find('div.jBoxControls');
		box.closecontrols = box.find('div.jBoxButton');
		box.content = box.find('div.jBoxContent');
		box.status = box.find('div.jBoxStatus');
		box.Resize = box.find('div.jBoxResize');
		box.handler._parent = box;
		box.closecontrols._parent = box;
		box.controls._parent = box;
		box.content._parent = box;
		box.onclose = function() {
			return true
		};
		box.isResize = function(bol) {
			jBox.isResize(this, bol);
		};
		box.isScrolling = function(bol) {
			jBox.isScrolling(this, bol);
		};
		box.setSize = function(w, h) {
			jBox.setSize(this, w, h);
		};
		box.moveTo = function(x, y) {
			jBox.moveTo(this, x, y);
		};
		box.show = function() {
			jBox.show(this);
		};
		box.hide = function() {
			jBox.close(this);
		};
		box.load = function(type, source, date, title, ajaxOpt) {
			jBox.load(this, type, source, date, title, ajaxOpt);
		};
		box.dispose = function() {
			jBox.dispose(this);
		}
		box.attr('jBoxID', this.boxes.length);
		box.jBoxID = this.boxes.length;
		this.boxes[this.boxes.length] = box;
		return box;
	},
	load : function(box, type, source, date, title, ajaxOpt) {
		// $("select").hide();
		var type = type.toLowerCase();
		if (typeof title != 'undefined')
			box.handler.get(0).firstChild.nodeValue = title;
		if (title == '') {
			box.handler.css('backgroundColor', '#fff');
			box.handler.css('padding', '0px');
			box.content.css('padding', '0px 10px');
		}

		if (box != 'undefined') {
			box.bgiframe();
		}
		if (type == "inline") {
			box.content.html(source);
		} else if (type == "div") {
			box.content.html($('#' + source).html());
		} else if (type == "iframe") {
			box.content.css('overflow', 'hidden');
			if (box.content.children().length < 1
					|| box.content.children().get(0).tagName != "IFRAME")
				box.content
						.html('<iframe src="" style="margin:0; padding:0; width:100%; height: 100%" name="_iframe-' + box.jBoxID + '"></iframe>');
			window.frames["_iframe-" + box.jBoxID].location.replace(source);
		} else if (type == "load") {
			//box.content.css('overflow', 'hidden');
			if (date != "") {
				box.content.load(source, date, function(d) {
				});
			} else {
				box.content.load(source, function() {
				});
			}
			// box.content.load(source);
		}
		box.content.datatype = type;
	},
	open : function(id, type, source, date, title, attr, buttonsEvent, ajaxOpt) {

		function getValue(Name) {
			var config = new RegExp(Name + "=([^,]+)", "i");
			return (config.test(attr)) ? eval('(' + RegExp.$1 + ')') : 0;
		}
		var box;
		// Find a jbox element has been created else create new element
		if ($('#jb' + id).length == 0)
			box = this.init(id, buttonsEvent );
		else {
			box = jBox.boxes[parseInt($('#jb' + id).get(0).getAttribute(
					'jBoxID'))];
		}

		box.setSize(getValue(("width")), (getValue("height")));
		var xpos = getValue("center") ? "middle" : getValue("left");
		var ypos = getValue("center") ? "middle" : getValue("top");
		box.css("visibility", "visible");
		box.css("display", "block");
		box.content.css("display", "block");
		box.isResize(getValue("resize"));
		box.isScrolling(getValue("scrolling"));
		box.isModel = getValue("model");

		if (box.isModel)
			jBox.showModel();
		box.minimizable = getValue("minimizable");
		if (!box.minimizable) {
			if (box.controls.find('img[@title=Minimize]').length > 0)
				box.controls.find('img[@title=Minimize]').remove()
		}
		;
		if (getValue("draggable")) {
			box.handler.mousedown(function(e) {
				jBox.etarget = this;
				jBox.setupDrag(e);
			});
		}
		if (getValue("scrolling")) {
			box.Resize.mousedown(function(e) {
				jBox.etarget = this;
				jBox.setupDrag(e);
			});
		}
		box.controls.click(function(e) {
			jBox.setupControls(e);
		});
		// box.find('div.jBoxContent');
		box.closecontrols.click(function(e) {
			jBox.setupControls(e);
		});
		
		
		box.load(type, source, date, title, ajaxOpt);

		box.moveTo(xpos, ypos);
		return box;
	},
	isResize : function(box, bol) {
		box.status.css("display", (bol) ? "block" : "none");
		box.resizeBool = (bol) ? 1 : 0;
	},
	isScrolling : function(box, bol) {
		box.content.css("overflow", (bol) ? "auto" : "hidden");
	},
	setSize : function(box, w, h) {
		box.css("width", Math.max(parseInt(w), 150) + 'px');
		box.content.css("height", Math.max(parseInt(h), 100) + 'px');
	},
	reSize : function(box, e) {
		box.css('width', Math.max(jBox.width + jBox.distancex, 150) + "px");
		box.content.css('height', Math.max(jBox.contentheight + jBox.distancey,
				100)
				+ "px");
	},
	moveTo : function(box, x, y) {
		this.getViewPoint();
		box.css("left", (x == "middle") ? this.scrollPos[0]
				+ (this.docSize[0] - box.get(0).offsetWidth) / 2 + "px"
				: this.scrollPos[0] + parseInt(x) + "px");
		box.css("top", (y == "middle") ? this.scrollPos[1]
				+ (this.docSize[1] - box.get(0).offsetHeight) / 2 + "px"
				: this.scrollPos[1] + parseInt(y) + "px");
	},
	show : function(box) {
		box.css('display', 'block');
		box.state = 'restore';
		if (box.isModel)
			jBox.showModel();
	},
	close : function(box) {
		// $("select").show();
		// if(box==undefined){
		// box=jBox.boxes[0];
		// }
		try {
			var closewinbol = box.onclose();
		} catch (err) {
			var closewinbol = true;
		} finally {
			if (typeof closewinbol == "undefined") {
				alert("An error has occured somwhere inside your \"onclose\" event handler")
				var closewinbol = true
			}
		}
		if (closewinbol) {
			if (box.state != "minimized")
				jBox.saveViewState(box);
			box.css('display', 'none');
			if (box.isModel)
				jBox.hideModel();
		}
		return closewinbol;
	},
	dispose : function(box) {
		if (box.isModel)
			jBox.hideModel();

		for ( var i = 0; i < jBox.boxes.length; i++) {

			if (jBox.boxes[i] == box) {
				box.handler._parent = null;
				box.controls._parent = null;

				box.content._parent = null;
				jBox.boxes[i] = null;
				break;
			}
		}
		box.remove();
	},
	minimize : function(btn, box) {
		jBox.saveViewState(box);
		btn.setAttribute('src', jBox.imgs[2]);
		btn.setAttribute('title', 'Restore');
		box.state = 'minimized';
		box.content.css('display', 'none');
		box.status.css('display', 'none');
		if (typeof box.minimizeorder == 'undefined') {
			jBox.minimizeorder++;
			box.minimizeorder = jBox.minimizeorder;
		}
		box.css('left', '10px');
		box.css('width', '200px');
		var margin = box.minimizeorder * 10;
		box.css('top', jBox.scrollPos[1] + jBox.docSize[1]
				- (box.handler.get(0).offsetHeight * box.minimizeorder)
				- margin + 'px');
	},
	restore : function(btn, box) {
		jBox.getViewPoint();
		btn.setAttribute('src', jBox.imgs[0]);
		btn.setAttribute('title', 'Minimize');

		box.state = 'restore';
		box.css('display', 'block');
		box.content.css('display', 'block');
		if (box.resizeBool)
			box.status.css('display', 'block');
		box.css('left', parseInt(box.lastPos[0]) + jBox.scrollPos[0] + 'px');
		box.css('top', parseInt(box.lastPos[1]) + jBox.scrollPos[1] + 'px');
		box.css('width', parseInt(box.lastSize[0]) + 'px');
	},
	closeControls : function(e) {
		var j = jBox;
		var sourceobj = window.event ? window.event.srcElement : e.target;
		var box = j._retBox(sourceobj);
		j.dispose(box);
	},
	setupControls : function(e) {
		var j = jBox;
		var sourceobj = window.event ? window.event.srcElement : e.target;
		var box = j._retBox(sourceobj);

		if (/Minimize/i.test(sourceobj.getAttribute("title")))
			j.minimize(sourceobj, box);
		else if (/Restore/i.test(sourceobj.getAttribute("title")))
			j.restore(sourceobj, box);
		else if (/关闭/i.test(sourceobj.getAttribute("title")))
			j.dispose(box);
		return false;
	},
	showModel : function() {
		var model = $('#jBox_hideIframe');

		if (model.length == 0) {
			model = $('<iframe id="jBox_hideIframe" scrolling="no" frameborder="0" style="position:absolute; top:0px; left:0px;-moz-opacity:0.7; opacity:0.7;filter:alpha(opacity=70);background:#fff;"></iframe>');
			model.appendTo(document.body);
			$(window).bind('resize', function() {
				jBox.showModel();
			})
		}
		jBox.getViewPoint();
		model.css('width', jBox.pageSize[0] + 'px');
		model.css('height', jBox.pageSize[1] + 'px');
	},
	hideModel : function() {
		$(window).unbind('resize')
		var model = $('#jBox_hideIframe');
		if (model.length > 0)
			model.remove();
	},
	setupDrag : function(e) {
		var j = jBox;
		var boxE = j.etarget;
		var box = j._retBox(boxE);
		var e = window.event || e;
		j.initmousex = e.clientX;
		j.initmousey = e.clientY;
		j.initx = parseInt(box.get(0).offsetLeft);
		j.inity = parseInt(box.get(0).offsetTop);
		j.width = parseInt(box.get(0).offsetWidth);
		j.contentheight = parseInt(box.content.get(0).offsetHeight);
		if (box.content.datatype == "iframe") {
			box.css('backgroundColor', '#F8F8F8');
			box.content.css('visibility', 'hidden');
		}
		document.onmousemove = j.getDistance;
		document.onmouseup = function() {
			if (box.content.datatype == "iframe") {
				box.content.css('visibility', 'visible');
			}
			j.stopDrag();
		}
		return false;
	},
	getDistance : function(e) {
		var j = jBox;
		var etarget = j.etarget;
		var e = window.event || e;
		j.distancex = e.clientX - j.initmousex;
		j.distancey = e.clientY - j.initmousey;
		var box = j._retBox(etarget);
		if (etarget.className == 'jBoxHandler') {
			box.css('left', j.distancex + j.initx + 'px')
			box.css('top', j.distancey + j.inity + 'px')
		} else if (etarget.className == 'jBoxResize')
			j.reSize(box, e);
		return false;
	},
	stopDrag : function() {
		jBox.etarget = null;
		document.onmousemove = null;
		document.onmouseup = null;
	},
	getViewPoint : function() {
		var ie = document.all && !window.opera
		var domclientWidth = document.documentElement
				&& parseInt(document.documentElement.clientWidth) || 100000;
		this.standardbody = (document.compatMode == "CSS1Compat") ? document.documentElement
				: document.body;
		this.scrollPos = [
				(ie) ? this.standardbody.scrollLeft : window.pageXOffset,
				(ie) ? this.standardbody.scrollTop : window.pageYOffset ];
		this.docSize = [
				(ie) ? this.standardbody.clientWidth : (/Safari/i
						.test(navigator.userAgent)) ? window.innerWidth : Math
						.min(domclientWidth, window.innerWidth - 16),
				(ie) ? this.standardbody.clientHeight : window.innerHeight ];
		if (ie) {
			this.scrollSize = [
					(document.body.scrollWidth > document.body.offsetWidth) ? document.body.scrollWidth
							: document.body.offsetWidth,
					(document.body.scrollHeight > document.body.offsetHeight) ? document.body.scrollHeight
							: document.body.offsetHeight ];
		} else {
			this.scrollSize = [ document.body.scrollWidth,
					window.innerHeight + window.scrollMaxY ];
		}
		this.pageSize = [
				(this.scrollSize[0] < this.docSize[0]) ? this.docSize[0]
						: this.scrollSize[0],
				(this.scrollSize[1] < this.docSize[1]) ? this.docSize[1]
						: this.scrollSize[1] ];
	},
	saveViewState : function(box) {
		this.getViewPoint();
		box.lastPos = [
				parseInt((box.css('left') || box.get(0).offsetLeft))
						- jBox.scrollPos[0],
				parseInt((box.css('top') || box.get(0).offsetTop))
						- jBox.scrollPos[1] ];
		box.lastSize = [ parseInt(box.css('width')),
				parseInt(box.css('height')) ];

	},
	_retBox : function(dom) {
		return jBox.boxes[parseInt($(dom).parents('div.jBox').get(0)
				.getAttribute('jBoxID'))];
	}
}


